#include "TLV.hpp"
#include <string.h>
#include <iostream>
#include <cstring>
#include "func.h"
using std::cout;
using std::endl;

namespace wd
{
//无参构造函数
TLV::TLV()
:_type(0)
,_length(0)
{
   memset(data,0,sizeof(data));
}
    //有参构造
TLV::TLV(int type,int length,const char *d)
:_type(type)
,_length(length)
{
    memset(data,0,sizeof(data));
    if(d!=nullptr&&length>0&&length<sizeof(data))
    {
       memcpy(data,d,length);
    }
}
TLV::~TLV()
{}
//获取长度
int TLV::getTotalLength()const
{
    return sizeof(_type)+sizeof(_length)+_length;
}
    //序列化将TLV转换为字节流
void TLV::serialize(string &byteStream)const
{
    int net_type=htonl(_type);
    int net_length=htonl(_length);
    //这是一个类型转换操作，将 type 的地址强制转换为 const char* 类型。
    //将 type 的内容视为字节序列（ char 类型通常表示一个字节）
    byteStream.append(reinterpret_cast<const char *>(&net_type),sizeof(net_type));
    byteStream.append(reinterpret_cast<const char *>(&net_length),sizeof(net_length));
    byteStream.append(data,_length);
}
//反序列化
void TLV::deserialize(const char* buffer)
{
    if(buffer==nullptr)return;
    int net_type,net_length;
    memcpy(&net_type,buffer,sizeof(net_type));
    memcpy(&net_length,buffer+sizeof(net_type),sizeof(net_length));

    _type=ntohl(net_type);
    _length=ntohl(net_length);
    if(_length>0&&_length<=1024)
    {
        memcpy(data,buffer+sizeof(net_type)+sizeof(net_length),_length);
        data[_length]='\0';
    }
    else
    {
        memset(data,0,sizeof(data));
    }
}
//测试打印TLV的详细信息
void TLV::print()
{
  cout<<"TLV信息"<<endl;
  cout<<"类型type"<<_type<<endl;
  cout<<"长度length"<<_length<<endl;
  cout<<"数据data"<<string(data,_length)<<endl;
}

}
